package top.humbleyuan.math;

/**
 * @Author HumbleYuan
 * @Date 2020/5/21 22:29
 * @Des 字符串转整数
 * @pro 待补充有限状态机
 */
public class LeetCode_8 {
    /**
     * 与第7题类比，也有res = res*10 + curNum的类似的计算过程
     * 这次是从前往后算，7中因为要逆序，所以要从后往前pop计算
     * @param args
     */
    public static void main(String[] args) {
        String str = "2147483646";

        // 先去除前面空格
        int i;
        for (i = 0; i < str.length(); i++) {
            if(str.charAt(i) != ' ') {
                break;
            }
        }

        if(i >= str.length()) {
            System.out.println(0);
            return;
        }

        boolean isPositive = true;
        if(str.charAt(i) == '-') {
            isPositive = false;
            i++;
        } else if(str.charAt(i) == '+') {
            i++;
        }


        int res = 0;
        if(i < str.length() && (str.charAt(i) < '0' || str.charAt(i) > '9')) {
            System.out.println(0);
            return;
        }

        for (int j = i; j < str.length(); j++) {

            if(str.charAt(j) > '9' || str.charAt(j) < '0') {
                break;
            }

            int curNum = str.charAt(j) - '0';

            // 判溢出，这里正负数没差别，因为一定是res > 214748364(无论curNum是几)
            // 这里要倒推来判断溢出
            // 这里不用考虑是否整除问题，因为不整除那么一定会约掉数，那么一定不会溢出
            // 例如214748364，curNum = 3,res = 2147483643,(2147483647 - 3) / 10 = 214748364
            // 这里若是-2147483648，res = 214748364, curNum = 8,后面是2147483639 / 10 = 214748363,判断是溢出，结果没溢出
            // 但是因为溢出要求还是返回边界值，所以这种情况恰好是边界值，所以可以混为一种情况
            if(res > (Integer.MAX_VALUE - curNum) / 10) {
                System.out.println(isPositive ? Integer.MAX_VALUE : Integer.MIN_VALUE);
                return;
            }

            res = res * 10 + curNum;
        }

        System.out.println(isPositive ? res : -res);
    }
}
